/*--------------------------------------------------------------*                                       
 *--------------------------------------------------------------*/

#ifndef _EXT_BLOCK_LOG_H_
#define _EXT_BLOCK_LOG_H_

#include <stdint.h>
#include "rtctime.h"

#define FLASH_BLOCK_ERR_NONE         0
#define FLASH_BLOCK_ERR_PAGE_SIZE    1  /*扇区尺寸错误*/
#define FLASH_BLOCK_ERR_BLOCK_SIZE   2  /*BLOCK尺寸错误*/
#define FLASH_BLOCK_ERR_BLOCK_NUMS   3
#define FLASH_BLOCK_ERR_SIZE         4  /*实际数据个数*/
#define FLASH_BLOCK_ERR_PAG_PER_BLK  5  /*基址错误,基址未对齐到扇区边界*/
#define FLASH_BLOCK_ERR_LOG_SIZE     6  /*数据尺寸大于eep尺寸*/


typedef struct{
    uint32_t block_next;       /*指向当前准备写入的块位置， 相对base的位置*/
    uint32_t block_start;     /*数据起始块地址， 相对base的位置*/
    uint16_t Err;             /*上次错误代码*/
    uint8_t Checked;          /*参数已经通过检测*/
	uint8_t full;             /*数据已经存满，继续存储将开始覆盖式写入*/
} block_log_info_type;


typedef const struct {
	uint32_t block_base;    /*起始块逻辑号*/
    uint16_t block_amount;  /*总块数*/
    uint16_t page_per_block; /*每块页数*/
    uint32_t block_size;    /*块尺寸，字节数*/
	uint32_t size;          /*总尺寸，字节数，仅用于判定参数*/
    uint16_t page_size;     /*页面尺寸，字节数 */
	uint16_t log_size;       /*每条日志尺寸，用于搜索位置*/
	uint32_t *WorkBuff;      /*工作缓存,不小于日志尺寸*/
    block_log_info_type *Info; /*运行时信息*/
    uint8_t (*Erase)(uint32_t block_addr); /*从指定地址擦除*/
    uint8_t (*Program)(uint32_t block_addr);    /*向指定指定地址编程数据*/
    uint8_t (*Read)(uint32_t block_addr, uint32_t page_offset, uint32_t Len, uint8_t *Data);       /*从指定位置读取数据*/
} block_log_cfg_type;

uint16_t block_log_check(block_log_cfg_type *EepCfg);
uint16_t block_log_save(block_log_cfg_type *EepCfg);

uint16_t block_log_head_search(block_log_cfg_type *Cfg, uint32_t num, uint32_t *page_des);

/*-----------------------------------------------------------------------------------------------------*
 * 快速搜索，内部采用二分搜索法，从start到next-1区间
 * mode: 0(未命中目标时返回-1)，-1(未命中目标时返回小于目标值的位置)，1(未命中目标时返回大于目标值的位置)
 * return 返回-1代表未搜到指定结果， +数指向搜索结果页位置
 *-----------------------------------------------------------------------------------------------------*/
int32_t block_log_quick_search(const block_log_cfg_type * cfg, sig_time_type time, int8_t mode);

#endif
